package org.gwt.client.vista;

import org.gwt.client.vista.figuras.Ejes;
import org.gwt.client.vista.figuras.Vector;
import org.gwt.client.vista.figuras.Linea;
import org.gwt.client.vista.figuras.Plano;
import org.gwt.client.vista.figuras.Punto;
import org.vaadin.gwtgraphics.client.DrawingArea;
import org.vaadin.gwtgraphics.client.shape.Text;

import com.google.gwt.user.client.Window;

public class Canvas {
	private DrawingArea canvas;
	private Punto punto;
	private Linea linea;
	private Vector flecha;
	private Plano plano;
	private Ejes ejes;
	private int x1,y1,x2;
	private int x_,y_;
	private boolean xNegativo,yNegativo,zNegativo;
	private boolean _3D;
	private int escala;

	public Canvas(){
		boolean nav=Window.Navigator.getAppName().equalsIgnoreCase("Microsoft Internet Explorer");
		ejes=new Ejes(nav);
		punto=new Punto(nav);
		linea=new Linea(nav);
		flecha=new Vector(nav);
		plano=new Plano();
		setEscala(5);
	}

	public DrawingArea getCanvas(){
		return canvas;
	}
	
	public void setCanvas(DrawingArea canvas){
		this.canvas=canvas;		
	}
	
	public void setPosicion(){
		x1=canvas.getWidth()/2;
		if(canvas.getWidth()>canvas.getHeight())	
			x2=x1+canvas.getHeight()/2-20;			
		else			
			x2=(2*x1)-30;
		y1=(canvas.getHeight()/2);
	}

	public void dibujarLinea(int x_1, int y_1,int x_2, int y_2,String color){
		linea.setColor(color);
		canvas.add(linea.dibujar(x_1,y_1,x_2,y_2));
	}
	
	public void lineasNegativaX(){
		if(!xNegativo){
			xNegativo=true;
			flecha.setOpacidad(0.2);
			flecha.setAncho(3);
			flecha.setColor("green");			
			canvas.add(flecha.dibujar(x1, y1, x1-canvas.getHeight()/2-20, y1));
		}
	}
	
	public void lineasNegativaZ(){
		if(!yNegativo){			
			yNegativo=true;	
			int lz_x,lz_y;
			lz_y=lz_x=(int) Math.sqrt((Math.pow(x2-x1, 2)/2));
			lz_x=x1+lz_x;
			lz_y=y1-lz_y;
			
			flecha.setOpacidad(0.2);
			flecha.setColor("red");
			flecha.setAncho(3);
			canvas.add(flecha.dibujar(x1, y1, lz_x, lz_y));
		}
	}
	
	public void lineasNegativaY(){
		if(!zNegativo){			
			zNegativo=true;
			flecha.setOpacidad(0.2);
			flecha.setColor("red");
			flecha.setAncho(3);
			canvas.add(flecha.dibujar(x1, y1, x1, canvas.getHeight()-50));
		}
	}
	
	public int dibujarLineasAux(int x, int y,int z){
		int d=(int) Math.sqrt(Math.pow(z, 2)/2);
		int px=x1+x;
		int py_x=x1-d;
		int py_y=y1+d;

		linea.setOpacidad(0.5);
		linea.setAncho(1);
		if(x==0&&y==0&&z==0) return d;

		else if(x==0&&z==0) {
			dibujarLinea(px-d,py_y,px-d,py_y-y, "red");
			return d;
		}
		else if(x==0&&z>0){
			dibujarLinea(x1, py_y-y-d,py_x+x,py_y-y,"blue");
			dibujarLinea(px-d,py_y,px-d,py_y-y, "red");
		}
		else if(x==0&&z<0){
			dibujarLinea(x1, y1-y,x1+x+d,y1-y-d,"blue");
			dibujarLinea(x1+x+d,y1-d,x1+x+d,y1-d-y, "red");
		}
		else if(z==0){
			dibujarLinea(x1, py_y-y,px-d,py_y-y , "green");
			dibujarLinea(px-d,py_y,px-d,py_y-y, "red");
		}
		else if(z<0){
			dibujarLinea(px, y1,x1+d+x,y1-d,  "blue");
			dibujarLinea(x1+d,y1-d,x1+d+x,y1-d, "green");
			dibujarLinea(x1+d+x,y1-d,x1+d+x,y1-d-y, "red");
		}
		else if(x<0&&z<0){
			py_x=x1+d;
			py_y=y1-d;
			dibujarLinea(py_x,py_y,py_x+x,py_y, "green");
			dibujarLinea(px, y1,py_x+x,py_y,  "blue");
			dibujarLinea(px+d,py_y,px+d,py_y-y, "red");
		}
		else{
			dibujarLinea(py_x, py_y,px-d,py_y , "green");
			dibujarLinea(px, y1, px-d, py_y, "blue");
			dibujarLinea(px-d,py_y,px-d,py_y-y, "red");
		}
		return d;
		}

	public void setEscala(int esc){
		this.escala=esc;
	}
	
	public void conver3D_2D(int x,int y,int z){		
		int factor=escalar(escala);
		int x_1=factor*x;
		int y_1=factor*y;
		int z_1=factor*z;
		int d_1=(int) Math.sqrt(Math.pow(z_1, 2)/2);
		if(x_1<=0&&z_1<=0){
			x_=x1+x_1+d_1;
			y_=y1-y_1-d_1;
		}
		else if(z_1<0){
			x_=x1+d_1+x_1;
			y_=y1-d_1-y_1;
		}
		else{
			x_=x1+x_1-d_1;	
			y_=y1-y_1+d_1;
		}
		dibujarLineasAux(x_1, y_1, z_1);
	}

	public int escalar(int div){		
		int dis=Math.abs(x2-x1);
		dis=dis/div;		
		return dis;
	}
	
	public Text dibujaNombre(int x,int y,String nombre,String color){
		Text t=new Text(x, y, nombre);
		t.setFillColor(color);
		t.setStrokeWidth(0);
		t.setFontFamily("Georgia");
		t.setFontSize(12);		
		return t;
	}

	public void dibujarPunto(int x, int y,String nombre,String color){
		int factor=escalar(escala);
		punto.setColor(color);
		canvas.add(punto.dibujar(x1+x*factor, y1-y*factor));
		canvas.add(dibujaNombre(x1+x*factor-10, y1-y*factor-10, nombre, color));
		if(x<0)	lineasNegativaX();
		if(y<0)	lineasNegativaY();
	}

	public void dibujarPunto(int x, int y,int z,String nombre,String color){
		punto.setColor(color);
		conver3D_2D(x, y, z);
		canvas.add(punto.dibujar(x_,y_));
		canvas.add(dibujaNombre(x_-10, y_-30, nombre, color));
		if(x==0&&z==0&&y<0)	lineasNegativaY();
		if(x<0)	lineasNegativaX();		
		if(z<0)	lineasNegativaZ();
		
	}

	public void dibujarVector(int x_1, int y_1,int x_2,int y_2,String nombre,String color) {
		int factor=escalar(escala);
		flecha.setColor(color);
		flecha.setOpacidad(1);
		flecha.setAncho(2);
		canvas.add(flecha.dibujar(x1+x_1*factor,y1+y_1*factor,x1+x_2*factor,y1-y_2*factor));
		canvas.add(dibujaNombre(x1+x_2*factor-20, y1-y_2*factor-10, nombre, color));
		if(x_1<0||x_2<0)	lineasNegativaX();
		if(y_1<0||y_2<0)	lineasNegativaY();
	}
	
	public void dibujarVector(int x_1, int y_1,int z_1,int x_2,int y_2,int z_2,String nombre,String color) {
		flecha.setColor(color);
		flecha.setOpacidad(1);
		flecha.setAncho(2);
		conver3D_2D(x_1, y_1, z_1);
		int x0=x_;
		int y0=y_;
		conver3D_2D(x_2, y_2, z_2);
		canvas.add(flecha.dibujar(x0,y0,x_,y_));
		canvas.add(dibujaNombre(x_-20, y_-10, nombre, color));
		if(x_1<0||x_2<0)	lineasNegativaX();
		if(y_1<0||y_2<0)	lineasNegativaY();
		if((x_1<0||x_2<0)&&(y_1<0||y_2<0)&&(z_1<0||z_2<0))	lineasNegativaZ();
	}

	public void dibujarVector(int x,int y,int z,String nombre,String color) {
		flecha.setColor(color);
		flecha.setOpacidad(1);
		flecha.setAncho(2);
		conver3D_2D(x, y, z);
		canvas.add(flecha.dibujar(x1,y1,x_,y_));
		canvas.add(dibujaNombre(x_-20, y_-10, nombre, color));
		if(x==0&&z==0&&y<0)	lineasNegativaY();
		if(x<0)	lineasNegativaX();		
		if(z<0)	lineasNegativaZ();
	}
	
	public void dibujarPlano(int x,int y,int z,int c,String nombre,String color) {
		plano.setEcuacion(x, y, z, c);
		plano.setOpacidad(0.2);
		plano.setOrigen(x1, y1);
		plano.setEscala(escalar(escala));
//		canvas.add(dibujaNombre(x1-20, y1-10, nombre, color));		
		canvas.add(plano.dibujar(color));		
	}

	public void dibujarEjes(boolean ejes3d){
		canvas.clear();
		_3D=ejes3d;
		setPosicion();
		xNegativo=yNegativo=zNegativo=false;	
		ejes.setEjes3d(_3D);
		canvas.add(ejes.dibujar(x1, y1,x2));
	}
}